package Mouse;

import java.awt.Container;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseDragActionPanel extends JPanel implements MouseMotionListener
{
    private static final int SquareWidth = 10;
    
    private static final int Max = 100;
    
    private Rectangle[] squares = new Rectangle[Max];
    
    private int squareCount = 0;
    
    private int currentSquareIndex = -1;
    
    public MouseDragActionPanel()
    {
        addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent evt)
            {
                int x = evt.getX();
                int y = evt.getY();
                currentSquareIndex = getSquare(x, y);
                if (currentSquareIndex < 0) // not inside a square
                add(x, y);
            }
            
            public void mouseClicked(MouseEvent evt)
            {
                int x = evt.getX();
                int y = evt.getY();
                
                if (evt.getClickCount() >= 2)
                {
                    remove(currentSquareIndex);
                }
            }
        });
        addMouseMotionListener(this);
    }
    
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for (int i = 0; i < squareCount; i++)
            ((Graphics2D) g).draw(squares[i]);
    }
    
    public int getSquare(int x, int y)
    {
        for (int i = 0; i < squareCount; i++)
            if (squares[i].contains(x, y)) return i;
        return -1;
    }
    
    public void add(int x, int y)
    {
        if (squareCount < Max)
        {
            squares[squareCount] = new Rectangle(x, y, SquareWidth, SquareWidth);
            currentSquareIndex = squareCount;
            squareCount++;
            repaint();
        }
    }
    
    public void remove(int n)
    {
        if (n < 0 || n >= squareCount) return;
        squareCount--;
        squares[n] = squares[squareCount];
        if (currentSquareIndex == n) currentSquareIndex = -1;
        repaint();
    }
    
    public void mouseMoved(MouseEvent evt)
    {
        int x = evt.getX();
        int y = evt.getY();
        
        if (getSquare(x, y) >= 0) setCursor(Cursor
                .getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
        else setCursor(Cursor.getDefaultCursor());
    }
    
    public void mouseDragged(MouseEvent evt)
    {
        int x = evt.getX();
        int y = evt.getY();
        
        if (currentSquareIndex >= 0)
        {
            Graphics g = getGraphics();
            g.setXORMode(getBackground());
            ((Graphics2D) g).draw(squares[currentSquareIndex]);
            squares[currentSquareIndex].x = x;
            squares[currentSquareIndex].y = y;
            ((Graphics2D) g).draw(squares[currentSquareIndex]);
            g.dispose();
        }
    }
    
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setTitle("MouseTest");
        frame.setSize(300, 200);
        frame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        
        Container contentPane = frame.getContentPane();
        contentPane.add(new MouseDragActionPanel());
        
        frame.show();
    }
}
